package com.cpimex.eprice.model;

import java.io.File; 
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;

import jxl.*; 
import jxl.read.biff.BiffException;


/**
 * Herramienta para subir precios a EPrice
 * 
 * 
 * @author Luis
 */
public class PriceTool {
	
	private final boolean DEBUG  = false;
	
	private final String VOID     = "";
	private Workbook workbook     = null; 
	private Sheet sheet           = null;
	private Statement stmt        = null; 
	private Hashtable ht_segmento = null;
	private Hashtable ht_grupo    = null;
	private File file_precio      = null;
	private int int_col           = 0;
	private String str_grupoTMP   = VOID; 
	private int int_row           = 0;
	private ArrayList arrL_grupos = null;
	private String str_log        = VOID;
	private String SUCCESS        = "Precios Actualizados con Exito";

	
	/**
	 * 
	 * 
	 * @throws BiffException
	 * @throws IOException
	 */
	public PriceTool(Connection conn, File file_precio) throws Exception{
		this.file_precio = file_precio;
		stmt = conn.createStatement();
		segmento();
		grupo();
	}
	
	
	/**
	 * Elimina los precios de los grupos a insertar
	 * 
	 * @throws Exception
	 */
	private void flush() throws Exception{
		getGrupos();
		String str_query = 
			" " +
			" DELETE FROM  ep_precioLista WHERE id_grupo in " +
			"(SELECT id_grupo FROM  ep_grupo WHERE desc_grupo in (";
		
		Iterator it = arrL_grupos.iterator();
		while(it.hasNext()){
			str_query += "'"+(String)it.next();
			str_query += "',";
		}
		str_query += " '-1' ))";
		stmt.executeUpdate(str_query);
	}
	
	
	/**
	 * Construye el Libro de Excel
	 * 
	 * 
	 * @throws Exception
	 */
	private void bookBuilder()throws Exception{
		workbook = Workbook.getWorkbook(file_precio);
		sheet    = workbook.getSheet(0); 
		int_col = sheet.getColumns();
		int_row = sheet.getRows();
	}
	
	
	/**
	 * 
	 * 
	 * @return
	 * @throws Exception
	 */
	public String upload() throws Exception{
		bookBuilder();
		flush();
		String str_grupo        = null;
		String str_limInferior  = null;
		String str_limSuperior  = null;
		String str_segmento     = null;
		String str_precio       = null; 	

		for(int int_i=1;int_i<int_row;int_i++){
			str_grupo        = sheet.getCell(0,int_i).getContents();
			str_limInferior  = sheet.getCell(3,int_i).getContents();
			str_limSuperior  = sheet.getCell(4,int_i).getContents();
			str_limInferior  = str_limInferior.replaceAll(",", "");
			str_limSuperior  = str_limSuperior.replaceAll(">", "");
			str_limSuperior  = str_limSuperior.replaceAll(",", "");
			
			for(int int_j=6;int_j<int_col;int_j++){
				str_segmento = sheet.getCell(int_j,0).getContents();
				str_precio   = sheet.getCell(int_j,int_i).getContents();
				if(str_precio.equals(VOID)){
					break;
				}else{
					if(ht_grupo.get(str_grupo)!=null && ht_segmento.get(str_segmento)!=null){
						 inserta(str_grupo, str_limInferior, str_limSuperior, str_segmento, str_precio);
					}else{
						str_log += "Error: " + "Fila: "+ int_i + "  Grupo: "+ str_grupo +  "  Segmento: " + str_segmento + "\n" ;
					}
				}
			}
			if(str_precio.equals(VOID)){break;}
			
		}
		if(str_log.equals(VOID)){str_log = SUCCESS;}
		return str_log;
	}
	
	
	/**
	 * Inserta Precio
	 * 
	 * @param str_grupo
	 * @param str_limInferior
	 * @param str_limSuperior
	 * @param str_segmento
	 * @param str_precio
	 * @return
	 * @throws Exception
	 */
	private void inserta(
			String str_grupo, 
			String str_limInferior, 
			String str_limSuperior, 
			String str_segmento, 
			String str_precio)throws Exception{
		
		String str_query = 
			"                                                  " +
			" INSERT INTO  ep_precioLista(	                   " +
			"			   rangomin_precioL,                   " +     
			"          	   rangomax_precioL,                   " +  
			"              codigoSeg_precioL,                  " +
			"			   cantidad_precioL,                   " + 
			"			   id_grupo)                           " +
			" VALUES(                                          " +
			"              "+str_limInferior+",                " +
			"              "+str_limSuperior+ ",               " +
			"             '"+ht_segmento.get(str_segmento)+"', " +
			"              "+str_precio +",                    " +
			"              "+ht_grupo.get(str_grupo)+"         " +
			")                                                 ";
		stmt.executeUpdate(str_query);
	}
	
	
	/**
	 * 
	 * 
	 * @param stmt
	 * @throws Exception
	 */
	private void segmento()throws Exception{
		ht_segmento = new Hashtable();
		
		String str_query =  
			" SELECT codigo_seg,                             " +
			"        codigo_div,                             " +
			"        descripcion_seg                         " +
			" FROM ep_vw_segmento                            ";
		String str_codigosegmento = null;
		String str_descsegmento   = null;
		
		ResultSet rs = stmt.executeQuery(str_query);
		while(rs.next()){
			str_codigosegmento = rs.getString("codigo_seg");
			str_descsegmento   = rs.getString("descripcion_seg");
			ht_segmento.put(str_descsegmento, str_codigosegmento);
		}	
	}
	
	
	/**
	 * 
	 * @throws Exception
	 */
	private void grupo() throws Exception{
		ht_grupo = new Hashtable();
		String str_query = 
			" SELECT id_grupo,            " +
			"        desc_grupo,          " +
			"        linea_grupo,         " +
			"        claseProducto_grupo  " +
			" FROM ep_grupo               ";
		String str_codigogrupo = null;
		String str_descgrupo   = null;
		
		ResultSet rs = stmt.executeQuery(str_query);
		
		while(rs.next()){
			str_codigogrupo = rs.getString("id_grupo");
			str_descgrupo   = rs.getString("desc_grupo");
			ht_grupo.put(str_descgrupo, str_codigogrupo);
		}
	}
	
	
	/**
	 * Obtiene los grupos de precios a insertar 
	 *
	 */
	private void getGrupos(){
		arrL_grupos = new ArrayList();
		for(int int_i=1;int_i<int_row;int_i++){
			if(DEBUG){
				System.out.println(sheet.getCell(0, int_i).getContents());
			}
			if(!str_grupoTMP.equals(sheet.getCell(0, int_i).getContents())){
				str_grupoTMP = sheet.getCell(0, int_i).getContents();
				arrL_grupos.add(str_grupoTMP);
			}
		}
	}
	
}
